package drongo.desktop.cmd
{
	import mx.utils.StringUtil;

	/**
	 *命令行行为格式对象，包含一个行为名称和一个参数类型列表，该对象可以检测一个CMDValue是否满足自身格式 
	 * @author Grayness
	 */
	public class CMDFormat
	{
		/**
		 *命令名称 
		 */		
		public var cmdName:String;
		/**
		 *参数限定类型列表 
		 */		
		public var arguTypes:Vector.<CMDFormatArgument>;
		/**
		 *最终可用参数列表，只有检测成功后此参数才会有值,否则列表中的值为null
		 */		
		public function get usefulArgument():Array
		{
			if(_usefulArgument)
				return _usefulArgument;
			else
			{
				var arr:Array=[];
				if(isArrayArgment())
				{
					arr[0]=null;
				}
				else
				{
					for(var i:int=0;i<arguTypes.length;i++)
					{
						arr[i]=null;
					}
				}
				return arr;
			}
		}
		private var _usefulArgument:Array;
		public function CMDFormat()
		{
		}
		//检查是否是列表类型的参数
		private function isArrayArgment():Boolean
		{
			if(arguTypes.length>0&&arguTypes[0].formatValueType==CMDFormatValueDefine.ARRAY)
				return true;
			return false;
		}
		
		/**
		 *是否满足格式条件 ，如果满足会将CMDValue的参数赋予usefulArgument
		 */		
		public function check(v:CMDValue):Boolean
		{
			_usefulArgument=null;
			if(cmdName==v.cmdName)
			{
				if(isArrayArgment())
				{
					if(checkForArray(v))
					{
						_usefulArgument=[];
						_usefulArgument[0]=v.arguValues
						return true;
					}
					else
					{
						_usefulArgument=[];
						_usefulArgument[0]="";
						return false;
					}
				}
				else
				{
					if(checkForSingle(v))
					{
						_usefulArgument=v.arguValues;
						return true;
					}
					else
					{
						_usefulArgument=[""];
						return false;
					}
				}
			}
			return false;
			//列表类型检测
			function checkForArray(v:CMDValue):Boolean
			{
				//是否存在数组数值类型判定参数
				var typeArgu:CMDFormatArgument;
				if(arguTypes.length==2&&arguTypes[1].formatValueType!=CMDFormatValueDefine.ARRAY)
					typeArgu=arguTypes[1];
				if(typeArgu)
				{
					for each(var vv:Object in v.arguValues)
					{
						switch(typeArgu.formatValueType)
						{
							case CMDFormatValueDefine.NUMBER:
								if(!Number(vv))
									return false;
								break;
							case CMDFormatValueDefine.STRING:
								if(!String(vv))
									return false;
								break;
						}
					}
				}
				return true;
			}
			//单参数形式检测，参数个数必须一直
			function checkForSingle(v:CMDValue):Boolean
			{
				if(arguTypes.length==v.arguValues.length)
				{
					var arguOK:Boolean=true;
					b:for(var i:int=0;i<arguTypes.length;i++)
					{
						c:switch(arguTypes[i].formatValueType)
						{
							case  CMDFormatValueDefine.STRING:
								if(!String(v.arguValues[i]))
								{
									arguOK= false;
									break b;
								}
								break c;
							case CMDFormatValueDefine.NUMBER:
								if(!Number(v.arguValues[i]))
								{
									arguOK= false;
									break b;
								}
								break c;
						}
					}
					return arguOK;
				}
				return false;
			}
		}
		/**
		 *根据一个格式化字符串生成一个命令格式对象（CMDFormat） 
		 * @param cmdStr 命令格式化字符串
		 * @return  CMDFormat
		 */		
		public static function createWithCMDFormatString(cmdStr:String):CMDFormat
		{
			var format:CMDFormat=new CMDFormat();
			cmdStr=StringUtil.trim(cmdStr);//砍掉两头空格
			var cutlist:Array=cmdStr.split(" ");
			format.cmdName=cutlist.shift();
			format.arguTypes=new Vector.<CMDFormatArgument>();
			for each(var stritem:String in cutlist)
			{
				stritem=stritem.substring(stritem.indexOf("[")+1,stritem.lastIndexOf("]"));
				format.arguTypes.push(new CMDFormatArgument(stritem));
			}
			return format;
		}
	}
}